package main

import (
	"fmt"
	"strconv"
)

//示例 1:
//
//输入: "42"
//输出: 42
//示例 2:
//
//输入: "   -42"
//输出: -42
//解释: 第一个非空白字符为 '-', 它是一个负号。
//我们尽可能将负号与后面所有连续出现的数字组合起来，最后得到 -42 。
//示例 3:
//
//输入: "4193 with words"
//输出: 4193
//解释: 转换截止于数字 '3' ，因为它的下一个字符不为数字。
//示例 4:
//
//输入: "words and 987"
//输出: 0
//解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
//因此无法执行有效的转换。
//示例 5:
//
//输入: "-91283472332"
//输出: -2147483648
//解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
//因此返回 INT_MIN (−231) 。
func main() {
	s := "words and 987"
	i := myAtoi(s)
	fmt.Println(i)

	s = "-91283472332"
	i = myAtoi(s)
	fmt.Println(i)

	s = "4193 with words"
	i = myAtoi(s)
	fmt.Println(i)

	s = "   -42"
	i = myAtoi(s)
	fmt.Println(i)

	s = "3.14159"
	i = myAtoi(s)
	fmt.Println(i)

	s = "+1"
	i = myAtoi(s)
	fmt.Println(i)

	s = "   +0 123"
	i = myAtoi(s)
	fmt.Println(i)

	s = "2147483648"
	i = myAtoi(s)
	fmt.Println(i)

	s = "-5-"
	i = myAtoi(s)
	fmt.Println(i)
}

func myAtoi(str string) int {
	var arr []rune

	flag := false
	for _, v := range str {
		if v == ' ' && len(arr) == 0 {
			continue
		} else if (v == '-' || v == '+') && !flag && len(arr)==0{
			flag = true
			arr = append(arr, v)
		} else if v <= '9' && v >= '0' {
			arr = append(arr, v)
		} else {
			break
		}
	}
	str = string(arr)
	i, _ := strconv.Atoi(str)
	if i > 1<<31-1 && i > 0 {
		return 1<<31 - 1
	}
	if i < 0 && i < -1<<31 {
		return -1 << 31
	}
	return i
}
